#include "app_message.h"
#include "cJSON/cJSON.h"
#include "log/log.h"
#include <string.h>
#include "app_common.h"
#include <stdlib.h>

/**
 * 将字符数组格式的消息数据转换为json格式的消息数据
    消息数据包含
        连接类型：1 代表蓝牙连接
        设备id: "xx"
        消息体内容: "abcd"
    字符数组格式： 1 2 4 xxabcd
        字节1：连接类型
        字节2：设备id长度
        字节3：消息体长度
        字节4~n：设备id和消息体
    json格式: {"conn_type": 1, "id": "5858", "msg": "61626364"}

 */
char *app_message_charsToJson(char *chars, int chars_len)
{
    // 1 2 4 xxabcd   {"conn_type": 1, "id": "5858", "msg": "61626364"}
    int conn_type = chars[0];
    int id_len = chars[1];
    int msg_len = chars[2];
    // 数据长度校验
    if ((id_len + msg_len + 3) != chars_len)
    {
        log_debug("charsToJson:error");
        return NULL;
    }

    // 从chars中提取id和msg
    char id[id_len];
    char msg[msg_len];
    memcpy(id, chars + 3, id_len);
    memcpy(msg, chars + 3 + id_len, msg_len);

    // 将字符串转换为16进制字符串
    char *id_hex = app_common_charsToHexstr(id, id_len);
    char *msg_hex = app_common_charsToHexstr(msg, msg_len);

    // 创建一个json
    cJSON *json = cJSON_CreateObject();
    // 给json添加数据
    cJSON_AddNumberToObject(json, "conn_type", conn_type);
    cJSON_AddStringToObject(json, "id", id_hex);
    cJSON_AddStringToObject(json, "msg", msg_hex);
    char *json_obj = cJSON_PrintUnformatted(json);

    // 释放内存
    free(id_hex);
    free(msg_hex);
    cJSON_Delete(json);

    // 返回json
    return json_obj;

}


int app_message_jsonToChars(char *json, char *chars_buf, int chars_len)
{
    // 1 2 4 xxabcd   {"conn_type": 1, "id": "5858", "msg": "61626364"}
    //将json转换为字符串
    //解析json
    cJSON *json_obj = cJSON_Parse(json);
    int conn_type = cJSON_GetObjectItem(json_obj, "conn_type")->valueint;
    char *id = cJSON_GetObjectItem(json_obj,"id")->valuestring;
    char *msg = cJSON_GetObjectItem(json_obj,"msg")->valuestring;
    //将16进制字符串转换为字符串
    int id_len = -1;
    int msg_len = -1;
    char *id_chars = app_common_hexstrToChars(id, &id_len);
    char *msg_chars = app_common_hexstrToChars(msg, &msg_len);

    //判断字符长度是否超过缓冲区长度
    if (id_len + msg_len + 3 > chars_len){
        cJSON_Delete(json_obj);
        return -1;
    }

    //将字符写入缓冲区
    chars_buf[0] = conn_type;
    chars_buf[1] = id_len;
    chars_buf[2] = msg_len;
    memcpy(chars_buf + 3, id_chars, id_len);
    memcpy(chars_buf + 3 + id_len, msg_chars, msg_len);
    
    //释放内存
    cJSON_Delete(json_obj);
    free(id_chars);
    free(msg_chars);

    return (id_len + msg_len + 3);

}
